<!-- 
   事件循环机制的基础模型
    
   1. 由各种io操作 (setTimeout/ ajax) 生成的事件会被先放到任务队列中等待被执行
   2. 任务队列有一个特点 谁先进入谁先执行 
   3. 任务队列中的代码 只有成功进入到主线程 才能被执行


   宏任务和微任务的关系

   1. 任务队列中描述的只有宏任务 task

   2. 每一个宏任务都会绑定一个属于自己的微任务队列 当前宏任务中的同步代码执行完毕之后 会检查当前微任务队列中是否有
      微任务 如果有全部遍历执行  执行完毕所有的微任务之后 才会执行下一个宏任务

   3. 当前宏任务中如果在执行的过程中又产生了新的宏任务 直接去任务队列中排队

   4. 当前的宏任务又产生了新的微任务  直接放到当前宏任务绑定的微任务队列中等待执行

   5. 当前的微任务中又生成了新的微任务 同样会放到当前微任务所属宏任务中的微任务队里中去
 -->

<script>
  // 打印结果

  // script标签生成了第一个宏任务  task 加入到任务队列中

  // 先执行同步代码 log 1  log5  -> 1 5 

  // 执行setimeout生成第二个宏任务  task会被加入到任务队列中

  // 执行.then生成一个微任务  它属于第一个宏任务 先执行第一个宏任务中的微任务队列 log 3 -> 3

  // 执行.then的时候生成了第三个宏任务 task会被加入到任务队列中

  // 宏任务1 -> 宏任务2  -> 宏任务3

  // 宏任务1已经执行完毕  开始排序执行宏任务2 和 3

  // log 2  log 4


  console.log(1)

  setTimeout(() => {
    console.log(2)
    setTimeout(() => {
      console.log(6)
    }, 0)
  }, 0)

  Promise.resolve().then(() => {
    console.log(3)
    setTimeout(() => {
      console.log(4)
    }, 0)
  })

  console.log(5)

  // 1 5 3 2 4 6
</script>